{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 去掉取值变化小的特征 (Removing features with low variance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1],\n",
       "       [1, 0],\n",
       "       [0, 0],\n",
       "       [1, 1],\n",
       "       [1, 0],\n",
       "       [1, 1]])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.feature_selection import VarianceThreshold\n",
    "X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]\n",
    "sel = VarianceThreshold(threshold=(.8 * (1 - .8)))\n",
    "sel.fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 单变量特征选择 (Univariate feature selection)\n",
    "## 2.1 Pearson相关系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lower noise (0.71824836862138408, 7.3240173129983507e-49)\n",
      "Higher noise (0.057964292079338155, 0.31700993885324752)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy.stats import pearsonr\n",
    "np.random.seed(0)\n",
    "size = 300\n",
    "x = np.random.normal(0, 1, size)\n",
    "print( \"Lower noise\", pearsonr(x, x + np.random.normal(0, 1, size)))\n",
    "print( \"Higher noise\", pearsonr(x, x + np.random.normal(0, 10, size)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.00230804707612\n"
     ]
    }
   ],
   "source": [
    "x1 = np.random.uniform(-1, 1, 100000)  \n",
    "print( pearsonr(x1, x1**2)[0]) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 互信息和最大信息系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0000000000000009\n"
     ]
    }
   ],
   "source": [
    "from minepy import MINE  \n",
    "m = MINE()  \n",
    "x = np.random.uniform(-1, 1, 10000)  \n",
    "m.compute_score(x, x**2)  \n",
    "print( m.mic()) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  2.4 基于学习模型的特征排序 (Model based ranking)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[(0.60999999999999999, 'LSTAT'),\n",
       " (0.44800000000000001, 'RM'),\n",
       " (0.35599999999999998, 'NOX'),\n",
       " (0.309, 'INDUS'),\n",
       " (0.28899999999999998, 'PTRATIO'),\n",
       " (0.23999999999999999, 'TAX'),\n",
       " (0.23100000000000001, 'ZN'),\n",
       " (0.19900000000000001, 'CRIM'),\n",
       " (0.19, 'RAD'),\n",
       " (0.11600000000000001, 'B'),\n",
       " (0.091999999999999998, 'AGE'),\n",
       " (0.048000000000000001, 'DIS'),\n",
       " (0.010999999999999999, 'CHAS')]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.cross_validation import cross_val_score, ShuffleSplit  \n",
    "from sklearn.datasets import load_boston  \n",
    "from sklearn.ensemble import RandomForestRegressor  \n",
    "  \n",
    "#Load boston housing dataset as an example  \n",
    "boston = load_boston()  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]  \n",
    "names = boston[\"feature_names\"]  \n",
    "  \n",
    "rf = RandomForestRegressor(n_estimators=20, max_depth=4)  \n",
    "scores = []  \n",
    "for i in range(X.shape[1]):  \n",
    "    score = cross_val_score(rf, X[:, i:i+1], Y, scoring=\"r2\",cv=ShuffleSplit(len(X), 3, .3))  \n",
    "    scores.append((round(np.mean(score), 3), names[i]))  \n",
    "#print (sorted(scores, reverse=True) ) \n",
    "sorted(scores, reverse=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 线性模型和正则化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 线性模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Linear model: 0.984 * X0 + 1.995 * X1 + -0.041 * X2\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression  \n",
    "import numpy as np  \n",
    "  \n",
    "np.random.seed(0)  \n",
    "size = 5000  \n",
    "  \n",
    "#A dataset with 3 features  \n",
    "X = np.random.normal(0, 1, (size, 3))  \n",
    "#Y = X0 + 2*X1 + noise  \n",
    "Y = X[:,0] + 2*X[:,1] + np.random.normal(0, 2, size)  \n",
    "lr = LinearRegression()  \n",
    "lr.fit(X, Y)  \n",
    "  \n",
    "#A helper method for pretty-printing linear models  \n",
    "def pretty_print_linear(coefs, names = None, sort = False):  \n",
    "    if names == None:  \n",
    "        names = [\"X%s\" % x for x in range(len(coefs))]  \n",
    "    lst = zip(coefs, names)  \n",
    "    if sort:  \n",
    "        lst = sorted(lst,  key = lambda x:-np.abs(x[0]))  \n",
    "    return \" + \".join(\"%s * %s\" % (round(coef, 3), name)  \n",
    "                                   for coef, name in lst)  \n",
    "  \n",
    "print (\"Linear model:\", pretty_print_linear(lr.coef_))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2\n"
     ]
    }
   ],
   "source": [
    "size = 100  \n",
    "np.random.seed(seed=5)  \n",
    "  \n",
    "X_seed = np.random.normal(0, 1, size)  \n",
    "X1 = X_seed + np.random.normal(0, .1, size)  \n",
    "X2 = X_seed + np.random.normal(0, .1, size)  \n",
    "X3 = X_seed + np.random.normal(0, .1, size)  \n",
    "  \n",
    "Y = X1 + X2 + X3 + np.random.normal(0,1, size)  \n",
    "X = np.array([X1, X2, X3]).T  \n",
    "  \n",
    "lr = LinearRegression()  \n",
    "lr.fit(X,Y)  \n",
    "print (\"Linear model:\", pretty_print_linear(lr.coef_))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 正则化\n",
    "### 3.2.1 L1正则化/Lasso"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lasso model:  -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO + -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM + 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import Lasso  \n",
    "from sklearn.preprocessing import StandardScaler  \n",
    "from sklearn.datasets import load_boston  \n",
    "  \n",
    "boston = load_boston()  \n",
    "scaler = StandardScaler()  \n",
    "X = scaler.fit_transform(boston[\"data\"])  \n",
    "Y = boston[\"target\"]  \n",
    "names = boston[\"feature_names\"]  \n",
    "  \n",
    "lasso = Lasso(alpha=.3)  \n",
    "lasso.fit(X, Y)  \n",
    "  \n",
    "print(\"Lasso model: \", pretty_print_linear(lasso.coef_, list(names), sort = True))  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2.2 L2正则化/Ridge regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Random seed 0\n",
      "Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2\n",
      "Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2\n",
      "Random seed 1\n",
      "Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2\n",
      "Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2\n",
      "Random seed 2\n",
      "Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2\n",
      "Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2\n",
      "Random seed 3\n",
      "Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2\n",
      "Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2\n",
      "Random seed 4\n",
      "Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2\n",
      "Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2\n",
      "Random seed 5\n",
      "Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2\n",
      "Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2\n",
      "Random seed 6\n",
      "Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2\n",
      "Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2\n",
      "Random seed 7\n",
      "Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2\n",
      "Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2\n",
      "Random seed 8\n",
      "Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2\n",
      "Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2\n",
      "Random seed 9\n",
      "Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2\n",
      "Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import Ridge  \n",
    "from sklearn.metrics import r2_score  \n",
    "size = 100  \n",
    "  \n",
    "#We run the method 10 times with different random seeds  \n",
    "for i in range(10):  \n",
    "    print(\"Random seed %s\" % i)  \n",
    "    np.random.seed(seed=i)  \n",
    "    X_seed = np.random.normal(0, 1, size)  \n",
    "    X1 = X_seed + np.random.normal(0, .1, size)  \n",
    "    X2 = X_seed + np.random.normal(0, .1, size)  \n",
    "    X3 = X_seed + np.random.normal(0, .1, size)  \n",
    "    Y = X1 + X2 + X3 + np.random.normal(0, 1, size)  \n",
    "    X = np.array([X1, X2, X3]).T  \n",
    "  \n",
    "  \n",
    "    lr = LinearRegression()  \n",
    "    lr.fit(X,Y)  \n",
    "    print (\"Linear model:\", pretty_print_linear(lr.coef_))\n",
    "  \n",
    "    ridge = Ridge(alpha=10)  \n",
    "    ridge.fit(X,Y)  \n",
    "    print(\"Ridge model:\", pretty_print_linear(ridge.coef_)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2.3 弹性网络/Elastic Net "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,\n",
      "   normalize=False, positive=False, precompute=False, random_state=None,\n",
      "   selection='cyclic', tol=0.0001, warm_start=False)\n",
      "r^2 on test data : 0.385982\n",
      "ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.7,\n",
      "      max_iter=1000, normalize=False, positive=False, precompute=False,\n",
      "      random_state=None, selection='cyclic', tol=0.0001, warm_start=False)\n",
      "r^2 on test data : 0.240498\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nXG55jx8/jqZpzJs3j/fff5/o6Gh8fHy44447+P5714lUDh48yAMPPEDTpk0xGo306NGDtWvX2ren\npaXx4IMPAhAfH28vd2Vt/wcPHuTBBx8kNDQUk8nELbfc4vLLf/fu3QwcOJCAgAD8/Py455572LZt\nm8u+srKymDRpEm3atMHHx4d27drxxhtv2G+stv4I6enpfP755/Yy2pqiAN5++22nz3zLli1u+zBs\n27aNQYMG0aRJE3x9fbn11ltZuHChfXt5fRiWLVtG9+7dMZlMNG3alKSkJE6edK7yj4+Pp2vXruzf\nv5++fftiNptp3bo1c+fOtefZunUrd9xxB0IIRo0aZS/z0qVLATh8+DDDhg2jRYsWGI1GwsLCSEpK\n4sqVKxWeD0djxnzGqlUHMBoNVX6NotSlixfzSUv7gczMPMxmL5o1863rInmUCt3roaysLC5cuOCU\nJoSgSZPyF0fZsWMH3333HUlJSbRu3Zr09HQWLVpE37592bdvHz4+PgDMnDmTOXPmMHbsWHr06EF2\ndjbff/89u3btol+/fjz99NOcPn2ar776io8++qjSX5Fnzpyx7+epp56iQ4cOnDp1ihUrVpCXl4e/\nv3+Fr//oo4/Iycnh6aefRgjBH//4R4YNG8bRo0ftN829e/fSq1cvWrduzbRp0zCbzXzyySckJiay\natUq7r//fnr37s3EiRN56623mD59OrfccgtAhVOI//TTT8TFxeHt7c1TTz1F27ZtOXLkCJ9//jmv\nvfYaYG3m6N27NwEBAbzwwgvo9XpSU1OJj4/n66+/pkePHoC1qaZ3796cOXOGp59+mrCwML755hum\nTZvG2bNnmTdvHjExMSxbtoxJkyYRFhbG1KlTAbjttttYtmwZjzzyCP379+exxx5zOu9la002btzI\n4MGDadmyJZMmTaJ58+bs37+ff/3rX0ycOLHc182aNYsZM2YwYsQIxowZQ0ZGBgsXLqRPnz7s3r3b\nfq6EEFy8eJGBAwcydOhQRowYwYoVK3jhhRfo2rUrAwYMICYmhldeeYUZM2bw1FNPERcXB8Cdd95J\nUVER/fv3p6ioiIkTJ9K8eXNOnTrF559/zuXLl/Hz86vwb8Jm1aoDXLyYT3T0jS8KpCi14dSpbEaN\nWsN33z1BcLCprovjeVLKevMAbgfkzp07pTs7d+6UFW1v6JYsWSKFEG4fRqPRKa8QQqakpNifFxQU\n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\ntnN56dKlSo/3yiuvkJiYSPv27encuTMJCQk8+uijdOnSpVrlVhTFvXPncvnkk71Mn967roviUY0+\nYHjqqViGDOlQ7nYfn8o/gn/+czgFBcUu6S1a+N5Q2W6U0Vg7Y3zLGwUgrc1IgLVD4ejRoxk6dCh/\n+MMfCA0NRafTMXv2bKeaiLpgsVjQNI0vv/zSbQDi61u359FisXaOevbZZ+19QsoqG+xU5ZyUJy4u\njiNHjrBmzRo2bNjA4sWLmT9/PqmpqdWehEpRFFcDBkQxbFhM5RkbmEYfMLRo4UeLFn43tI+OHUM8\nVJryhYSEYDKZOHjwoMu2/fv3o2may6/KqrA1bxw+fNipqePixYtV+jVaVStXriQqKooVK1Y4pc+Y\nMeO69hcVFcX27dspKSkp9+bYtm1bNm3aRG5urlMtw/79+4FrNTBRUVFIKQkPD3dby+BJUVFR7Nmz\np1qvsdXAGAwG+0gGT6iouSowMJCRI0cycuRI8vLyiIuLIzk5WQUMiuIBX375SF0XoUY0+j4MDYWm\nafTv3581a9Y4DYk8d+4cy5cvJy4u7rp+Cffr1w+dTsc777zjlP7WW2/dcJkdubupb9u2jW+//fa6\n9jds2DAyMjJ4++23y80zaNAgiouLXfLMnz8fTdNISEgAYOjQoWiaRkpKitv92IY7esKwYcP48ccf\nWbNmTZVfExISQnx8PKmpqZw9e9Zlu+Nwyeowm81cvnzZJb3s+zWZTERHR7sdNaMoimLT6GsYGpLX\nXnuNr776irvuuotx48ah0+l47733KCws5I033nDKW5WqZ4DQ0FB+//vfM2/ePO6//34SEhL48ccf\nWbduHSEhIS6/Qqu637Luu+8+Vq1aRWJiIvfeey9Hjx4lNTWVTp06OXXWrKrHHnuMpUuXMmXKFLZt\n20ZcXBw5OTls2rSJZ555hsGDBzN48GD69u3LSy+9xLFjx+zDKteuXWufBwGsv+Bfe+01XnzxRY4d\nO0ZiYiJ+fn4cPXqU1atX89RTTzFlypTret9lPffcc6xYsYLhw4czevRoYmNjuXDhAmvXriU1NbXc\nfgJ/+ctfiIuLo0uXLowZM4bIyEjOnTvHt99+y6lTp9i9e7c9b3nnqGx6bGws7777LrNmzSI6OprQ\n0FD69u1Lx44diY+PJzY2liZNmrBjxw5WrFjBxIkTPfIZKIrSOKmAoR7p2LEj//nPf5g2bRpz5szB\n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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x79cf0b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "# #############################################################################\n",
    "# Generate some sparse data to play with\n",
    "np.random.seed(42)\n",
    "\n",
    "n_samples, n_features = 50, 200\n",
    "X = np.random.randn(n_samples, n_features)\n",
    "coef = 3 * np.random.randn(n_features)\n",
    "inds = np.arange(n_features)\n",
    "np.random.shuffle(inds)\n",
    "coef[inds[10:]] = 0  # sparsify coef\n",
    "y = np.dot(X, coef)\n",
    "\n",
    "# add noise\n",
    "y += 0.01 * np.random.normal(size=n_samples)\n",
    "\n",
    "# Split data in train set and test set\n",
    "n_samples = X.shape[0]\n",
    "X_train, y_train = X[:n_samples // 2], y[:n_samples // 2]\n",
    "X_test, y_test = X[n_samples // 2:], y[n_samples // 2:]\n",
    "\n",
    "# #############################################################################\n",
    "# Lasso\n",
    "from sklearn.linear_model import Lasso\n",
    "\n",
    "alpha = 0.1\n",
    "lasso = Lasso(alpha=alpha)\n",
    "\n",
    "y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test)\n",
    "r2_score_lasso = r2_score(y_test, y_pred_lasso)\n",
    "print(lasso)\n",
    "print(\"r^2 on test data : %f\" % r2_score_lasso)\n",
    "\n",
    "# #############################################################################\n",
    "# ElasticNet\n",
    "from sklearn.linear_model import ElasticNet\n",
    "\n",
    "enet = ElasticNet(alpha=alpha, l1_ratio=0.7)\n",
    "\n",
    "y_pred_enet = enet.fit(X_train, y_train).predict(X_test)\n",
    "r2_score_enet = r2_score(y_test, y_pred_enet)\n",
    "print(enet)\n",
    "print(\"r^2 on test data : %f\" % r2_score_enet)\n",
    "\n",
    "plt.plot(enet.coef_, color='lightgreen', linewidth=2,\n",
    "         label='Elastic net coefficients')\n",
    "plt.plot(lasso.coef_, color='gold', linewidth=2,\n",
    "         label='Lasso coefficients')\n",
    "plt.plot(coef, '--', color='navy', label='original coefficients')\n",
    "plt.legend(loc='best')\n",
    "plt.title(\"Lasso R^2: %f, Elastic Net R^2: %f\"\n",
    "          % (r2_score_lasso, r2_score_enet))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 随机森林\n",
    "## 4.1平均不纯度减少 mean decrease impurity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their score:\n",
      "[(0.41760000000000003, 'RM'), (0.38159999999999999, 'LSTAT'), (0.058500000000000003, 'DIS'), (0.043900000000000002, 'CRIM'), (0.028899999999999999, 'NOX'), (0.0155, 'TAX'), (0.0137, 'B'), (0.0137, 'AGE'), (0.013299999999999999, 'PTRATIO'), (0.0074000000000000003, 'INDUS'), (0.0038, 'RAD'), (0.0011000000000000001, 'ZN'), (0.001, 'CHAS')]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_boston  \n",
    "from sklearn.ensemble import RandomForestRegressor  \n",
    "import numpy as np  \n",
    "#Load boston housing dataset as an example  \n",
    "boston = load_boston()  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]  \n",
    "names = boston[\"feature_names\"]  \n",
    "rf = RandomForestRegressor()  \n",
    "rf.fit(X, Y)  \n",
    "print (\"Features sorted by their score:\")  \n",
    "print (sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names),reverse=True))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Scores for X0, X1, X2: [0.27200000000000002, 0.54800000000000004, 0.17899999999999999]\n"
     ]
    }
   ],
   "source": [
    "size = 10000  \n",
    "np.random.seed(seed=10)  \n",
    "X_seed = np.random.normal(0, 1, size)  \n",
    "X0 = X_seed + np.random.normal(0, .1, size)  \n",
    "X1 = X_seed + np.random.normal(0, .1, size)  \n",
    "X2 = X_seed + np.random.normal(0, .1, size)  \n",
    "X = np.array([X0, X1, X2]).T  \n",
    "Y = X0 + X1 + X2  \n",
    "  \n",
    "rf = RandomForestRegressor(n_estimators=20, max_features=2)  \n",
    "rf.fit(X, Y)\n",
    "print (\"Scores for X0, X1, X2:\", list(map(lambda x:round (x,3), rf.feature_importances_)) )  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.2 平均精确率减少(Mean decrease accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their score:\n",
      "[(0.73109999999999997, 'LSTAT'), (0.57089999999999996, 'RM'), (0.087999999999999995, 'DIS'), (0.0385, 'NOX'), (0.036600000000000001, 'CRIM'), (0.023400000000000001, 'PTRATIO'), (0.017100000000000001, 'TAX'), (0.0129, 'AGE'), (0.0047000000000000002, 'B'), (0.0044999999999999997, 'INDUS'), (0.0035000000000000001, 'RAD'), (0.0001, 'ZN'), (-0.0001, 'CHAS')]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import ShuffleSplit  \n",
    "from sklearn.metrics import r2_score  \n",
    "from collections import defaultdict  \n",
    "  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]  \n",
    "  \n",
    "rf = RandomForestRegressor()  \n",
    "scores = defaultdict(list)  \n",
    "  \n",
    "#crossvalidate the scores on a number of different random splits of the data  \n",
    "for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):  \n",
    "    X_train, X_test = X[train_idx], X[test_idx]  \n",
    "    Y_train, Y_test = Y[train_idx], Y[test_idx]  \n",
    "    r = rf.fit(X_train, Y_train)  \n",
    "    acc = r2_score(Y_test, rf.predict(X_test))  \n",
    "    for i in range(X.shape[1]):  \n",
    "        X_t = X_test.copy()  \n",
    "        np.random.shuffle(X_t[:, i])  \n",
    "        shuff_acc = r2_score(Y_test, rf.predict(X_t))  \n",
    "        scores[names[i]].append((acc-shuff_acc)/acc)  \n",
    "print (\"Features sorted by their score:\")  \n",
    "print (sorted([(round(np.mean(score), 4), feat) for feat, score in scores.items()], reverse=True))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5 基于xgboost特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num_boost_rounds=200\n",
      "\n",
      "Training XGBoost ...\n",
      "[0]\ttrain-rmse:21.594\n",
      "Will train until train-rmse hasn't improved in 30 rounds.\n",
      "[1]\ttrain-rmse:19.5392\n",
      "[2]\ttrain-rmse:17.6901\n",
      "[3]\ttrain-rmse:16.0223\n",
      "[4]\ttrain-rmse:14.5219\n",
      "[5]\ttrain-rmse:13.1747\n",
      "[6]\ttrain-rmse:11.9558\n",
      "[7]\ttrain-rmse:10.8646\n",
      "[8]\ttrain-rmse:9.8802\n",
      "[9]\ttrain-rmse:8.99173\n",
      "[10]\ttrain-rmse:8.18644\n",
      "[11]\ttrain-rmse:7.46428\n",
      "[12]\ttrain-rmse:6.81289\n",
      "[13]\ttrain-rmse:6.22336\n",
      "[14]\ttrain-rmse:5.69471\n",
      "[15]\ttrain-rmse:5.21483\n",
      "[16]\ttrain-rmse:4.78178\n",
      "[17]\ttrain-rmse:4.39295\n",
      "[18]\ttrain-rmse:4.04741\n",
      "[19]\ttrain-rmse:3.73251\n",
      "[20]\ttrain-rmse:3.44781\n",
      "[21]\ttrain-rmse:3.19517\n",
      "[22]\ttrain-rmse:2.95854\n",
      "[23]\ttrain-rmse:2.75003\n",
      "[24]\ttrain-rmse:2.56302\n",
      "[25]\ttrain-rmse:2.39463\n",
      "[26]\ttrain-rmse:2.24377\n",
      "[27]\ttrain-rmse:2.11268\n",
      "[28]\ttrain-rmse:1.99532\n",
      "[29]\ttrain-rmse:1.89\n",
      "[30]\ttrain-rmse:1.79914\n",
      "[31]\ttrain-rmse:1.70975\n",
      "[32]\ttrain-rmse:1.62599\n",
      "[33]\ttrain-rmse:1.55156\n",
      "[34]\ttrain-rmse:1.48865\n",
      "[35]\ttrain-rmse:1.43152\n",
      "[36]\ttrain-rmse:1.37975\n",
      "[37]\ttrain-rmse:1.33545\n",
      "[38]\ttrain-rmse:1.29175\n",
      "[39]\ttrain-rmse:1.24808\n",
      "[40]\ttrain-rmse:1.21941\n",
      "[41]\ttrain-rmse:1.19062\n",
      "[42]\ttrain-rmse:1.15888\n",
      "[43]\ttrain-rmse:1.13093\n",
      "[44]\ttrain-rmse:1.10734\n",
      "[45]\ttrain-rmse:1.0809\n",
      "[46]\ttrain-rmse:1.06173\n",
      "[47]\ttrain-rmse:1.03877\n",
      "[48]\ttrain-rmse:1.01773\n",
      "[49]\ttrain-rmse:1.0046\n",
      "[50]\ttrain-rmse:0.988095\n",
      "[51]\ttrain-rmse:0.969424\n",
      "[52]\ttrain-rmse:0.95899\n",
      "[53]\ttrain-rmse:0.948933\n",
      "[54]\ttrain-rmse:0.936273\n",
      "[55]\ttrain-rmse:0.924288\n",
      "[56]\ttrain-rmse:0.910215\n",
      "[57]\ttrain-rmse:0.896837\n",
      "[58]\ttrain-rmse:0.891086\n",
      "[59]\ttrain-rmse:0.877581\n",
      "[60]\ttrain-rmse:0.870049\n",
      "[61]\ttrain-rmse:0.855703\n",
      "[62]\ttrain-rmse:0.848058\n",
      "[63]\ttrain-rmse:0.838991\n",
      "[64]\ttrain-rmse:0.830499\n",
      "[65]\ttrain-rmse:0.816549\n",
      "[66]\ttrain-rmse:0.806335\n",
      "[67]\ttrain-rmse:0.791328\n",
      "[68]\ttrain-rmse:0.774775\n",
      "[69]\ttrain-rmse:0.764023\n",
      "[70]\ttrain-rmse:0.748884\n",
      "[71]\ttrain-rmse:0.732728\n",
      "[72]\ttrain-rmse:0.723686\n",
      "[73]\ttrain-rmse:0.716291\n",
      "[74]\ttrain-rmse:0.707829\n",
      "[75]\ttrain-rmse:0.689744\n",
      "[76]\ttrain-rmse:0.679918\n",
      "[77]\ttrain-rmse:0.669124\n",
      "[78]\ttrain-rmse:0.656528\n",
      "[79]\ttrain-rmse:0.643337\n",
      "[80]\ttrain-rmse:0.636228\n",
      "[81]\ttrain-rmse:0.626759\n",
      "[82]\ttrain-rmse:0.620961\n",
      "[83]\ttrain-rmse:0.614755\n",
      "[84]\ttrain-rmse:0.605856\n",
      "[85]\ttrain-rmse:0.598949\n",
      "[86]\ttrain-rmse:0.586677\n",
      "[87]\ttrain-rmse:0.581813\n",
      "[88]\ttrain-rmse:0.57461\n",
      "[89]\ttrain-rmse:0.564203\n",
      "[90]\ttrain-rmse:0.560866\n",
      "[91]\ttrain-rmse:0.555039\n",
      "[92]\ttrain-rmse:0.549116\n",
      "[93]\ttrain-rmse:0.542047\n",
      "[94]\ttrain-rmse:0.53646\n",
      "[95]\ttrain-rmse:0.526279\n",
      "[96]\ttrain-rmse:0.520916\n",
      "[97]\ttrain-rmse:0.510293\n",
      "[98]\ttrain-rmse:0.501888\n",
      "[99]\ttrain-rmse:0.496864\n",
      "[100]\ttrain-rmse:0.490309\n",
      "[101]\ttrain-rmse:0.485604\n",
      "[102]\ttrain-rmse:0.47786\n",
      "[103]\ttrain-rmse:0.470993\n",
      "[104]\ttrain-rmse:0.465839\n",
      "[105]\ttrain-rmse:0.463659\n",
      "[106]\ttrain-rmse:0.458465\n",
      "[107]\ttrain-rmse:0.455829\n",
      "[108]\ttrain-rmse:0.453049\n",
      "[109]\ttrain-rmse:0.446016\n",
      "[110]\ttrain-rmse:0.444123\n",
      "[111]\ttrain-rmse:0.436813\n",
      "[112]\ttrain-rmse:0.428149\n",
      "[113]\ttrain-rmse:0.421389\n",
      "[114]\ttrain-rmse:0.416933\n",
      "[115]\ttrain-rmse:0.411299\n",
      "[116]\ttrain-rmse:0.406012\n",
      "[117]\ttrain-rmse:0.402202\n",
      "[118]\ttrain-rmse:0.399158\n",
      "[119]\ttrain-rmse:0.396875\n",
      "[120]\ttrain-rmse:0.3941\n",
      "[121]\ttrain-rmse:0.390563\n",
      "[122]\ttrain-rmse:0.386464\n",
      "[123]\ttrain-rmse:0.377966\n",
      "[124]\ttrain-rmse:0.375974\n",
      "[125]\ttrain-rmse:0.369645\n",
      "[126]\ttrain-rmse:0.367323\n",
      "[127]\ttrain-rmse:0.365947\n",
      "[128]\ttrain-rmse:0.359\n",
      "[129]\ttrain-rmse:0.355307\n",
      "[130]\ttrain-rmse:0.353447\n",
      "[131]\ttrain-rmse:0.351933\n",
      "[132]\ttrain-rmse:0.35057\n",
      "[133]\ttrain-rmse:0.349417\n",
      "[134]\ttrain-rmse:0.34216\n",
      "[135]\ttrain-rmse:0.336834\n",
      "[136]\ttrain-rmse:0.334676\n",
      "[137]\ttrain-rmse:0.33078\n",
      "[138]\ttrain-rmse:0.327335\n",
      "[139]\ttrain-rmse:0.325388\n",
      "[140]\ttrain-rmse:0.321693\n",
      "[141]\ttrain-rmse:0.316646\n",
      "[142]\ttrain-rmse:0.311773\n",
      "[143]\ttrain-rmse:0.309379\n",
      "[144]\ttrain-rmse:0.306595\n",
      "[145]\ttrain-rmse:0.302346\n",
      "[146]\ttrain-rmse:0.298686\n",
      "[147]\ttrain-rmse:0.296889\n",
      "[148]\ttrain-rmse:0.294481\n",
      "[149]\ttrain-rmse:0.289682\n",
      "[150]\ttrain-rmse:0.288961\n",
      "[151]\ttrain-rmse:0.284349\n",
      "[152]\ttrain-rmse:0.279947\n",
      "[153]\ttrain-rmse:0.276529\n",
      "[154]\ttrain-rmse:0.273997\n",
      "[155]\ttrain-rmse:0.270144\n",
      "[156]\ttrain-rmse:0.265613\n",
      "[157]\ttrain-rmse:0.2619\n",
      "[158]\ttrain-rmse:0.258404\n",
      "[159]\ttrain-rmse:0.255197\n",
      "[160]\ttrain-rmse:0.250911\n",
      "[161]\ttrain-rmse:0.248765\n",
      "[162]\ttrain-rmse:0.246756\n",
      "[163]\ttrain-rmse:0.243554\n",
      "[164]\ttrain-rmse:0.239739\n",
      "[165]\ttrain-rmse:0.238151\n",
      "[166]\ttrain-rmse:0.234082\n",
      "[167]\ttrain-rmse:0.229561\n",
      "[168]\ttrain-rmse:0.227256\n",
      "[169]\ttrain-rmse:0.223941\n",
      "[170]\ttrain-rmse:0.221759\n",
      "[171]\ttrain-rmse:0.217771\n",
      "[172]\ttrain-rmse:0.213299\n",
      "[173]\ttrain-rmse:0.209621\n",
      "[174]\ttrain-rmse:0.207642\n",
      "[175]\ttrain-rmse:0.20465\n",
      "[176]\ttrain-rmse:0.201792\n",
      "[177]\ttrain-rmse:0.19798\n",
      "[178]\ttrain-rmse:0.196013\n",
      "[179]\ttrain-rmse:0.193006\n",
      "[180]\ttrain-rmse:0.191501\n",
      "[181]\ttrain-rmse:0.189761\n",
      "[182]\ttrain-rmse:0.186551\n",
      "[183]\ttrain-rmse:0.184728\n",
      "[184]\ttrain-rmse:0.182441\n",
      "[185]\ttrain-rmse:0.179247\n",
      "[186]\ttrain-rmse:0.176444\n",
      "[187]\ttrain-rmse:0.173298\n",
      "[188]\ttrain-rmse:0.170463\n",
      "[189]\ttrain-rmse:0.167352\n",
      "[190]\ttrain-rmse:0.164308\n",
      "[191]\ttrain-rmse:0.163605\n",
      "[192]\ttrain-rmse:0.16111\n",
      "[193]\ttrain-rmse:0.158263\n",
      "[194]\ttrain-rmse:0.155402\n",
      "[195]\ttrain-rmse:0.15375\n",
      "[196]\ttrain-rmse:0.151436\n",
      "[197]\ttrain-rmse:0.149999\n",
      "[198]\ttrain-rmse:0.148258\n",
      "[199]\ttrain-rmse:0.145546\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nntHUH5r6Q1N/aOoLPf2haTJ0anEOFJqmpqaoR0Ce0dQfmvpDU39o6gs9/aFpMnRqt/Y4+2C39qWS\nLox6HHRKWlJ5u7u1AwAAAECh6sxu7TxzDgAAAABAxFicAwAAAAAQMRbniLWGhoaoR0Ce0dQfmvpD\nU39o6gs9/aFpMsRmcW5mi8xsi5ntMLPjo54HheGiiy6KegTkGU39oak/NPWHpr7Q0x+aJkMsFudm\nNkbSREljJQ2QtM7Mbjezl8ysycxqzOzEaKdET3j66aeVSqV0+OGHq6ioSKNGjWp1f2NjoyoqKnTk\nkUeqpKREn/zkJ3X33Xe3OmfdunX653/+Zx166KHq06ePLrjgAr322ms9eRnYjTlz5kQ9AvKMpv7Q\n1B+a+kJPf2iaDLFYnEsaLGlTCGFlCOF1SZWSzlJm2/XjJD0u6TdmdliEM6IHNDY2atiwYbrzzjtl\nZvr4xz/e6v6rrrpKy5cv1wMPPKD6+npdddVVqqio0MMPPywp8zEUo0ePVlFRkX7729/q2Wef1Xvv\nvafPfe5zUVwO2sGO/P7Q1B+a+kNTX+jpD02ToXfUA+yJmd0raZKkYGY7JL0uqa+kVAjhmexpc83s\nc5KukHR9NJOiJ4wZM0ZjxoyRJLX3MYArVqzQpEmTdNppp0mSLrnkEt11111atWqVzjvvPNXU1Oiv\nf/2rVq9erf3331+S9OMf/1gf+chH9OSTT+rMM8/suYsBAAAAgKw4PHM+TZkF9yvKvKT9RGV+qPBe\nznnbJI3o2dFQaE499VQtW7ZMGzdulCQ99dRTevHFF3XuuedKkv7+97/LzLTPPvs0f82+++6roqIi\n1dTURDIzAAAAABT84jyEsFXSVkk7QgivhxBekbRC0nVmdpiZFZnZBEmnSOJl7Qnz+OOPt/r9/Pnz\nVVZWpiOOOEL77LOPxo4dq4ULF+ozn/mMJOnTn/609t9/f82cOVPbtm1TY2OjrrnmGu3cuVObNm2K\n4hKQo7KyMuoRkGc09Yem/tDUF3r6Q9NkKPjFeQcmSDJJr0raLqlC0gOSdkY5FHreX/7yl1a//8EP\nfqCVK1fq4YcfVjqd1i233KIpU6boySeflCT169dPP/vZz/Twww/rgAMO0Ec+8hG98847OuGEE1RU\nFNe/Dr6k0+moR0Ce0dQfmvpDU1/o6Q9NkyGWq5EQwvoQwihJ+0s6MoTwaUn7SFq356+eJimVcztF\n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\nPf2haTKwIRx2o/A3hGtqalJJSUnUYyCPaOoPTf2hqT809YWe/tA0vtgQDonBNyl/aOoPTf2hqT80\n9YWe/tA0GVicAwAAAAAQMRbnAAAAAABELDaLczNbZGZbzGyHmR0f9TwoDDNmzIh6BOQZTf2hqT80\n9YemvtDTH5omQywW52Y2RtJESWMlHSapj5ktM7NXzWynmaWinTAZnn76aaVSKR1++OEqKirSsmXL\nWt0/d+5clZWV6YADDlDfvn11zjnnaNWqVc33v/nmm5o2bZqGDBmikpISHXXUUZo+fbreeeedLs80\ncODALn8tChNN/aGpPzT1h6a+0NMfmiZDLBbnkgZL2hRCWBlCeE3S/pKelzRFUjK2my8AjY2NGjZs\nmO68806ZWZv7S0tLtXDhQr3wwgt65plndPTRR2v06NHasmWLJGnjxo3atGmTbr31Vv3pT3/Sj3/8\nYz366KO65JJLujzT17/+9S5/LQoTTf2hqT809YemvtDTH5omQ8F/lJqZ3StpkjKLcJP0UghhUIv7\nd0r6QghhWQcPses8Pkqt0zr+KLWioiJVV1crler4RQtbt25Vnz599MQTT2jUqFHtnvPQQw/pq1/9\nqhobG1VUFJefFQEAAADAnnXmo9R698xIH8o0SX+RdKmkEyXtjHYc7I33339fd999tw4++GANHTq0\nw/PeeustHXTQQSzMAQAAACRawa+IQghbJW2VtCOE8HoIYUvUM6Fjv/71r3XggQequLhYd9xxhx5/\n/HH17du33XMbGhp044036vLLL+/yn1dfX9/lr0Vhoqk/NPWHpv7Q1Bd6+kPTZCj4xTni5cwzz9Tq\n1au1YsUKjRkzRueff74aGhranLd161b90z/9k4477jjNnj27y3/ezJkzP8y4KEA09Yem/tDUH5r6\nQk9/aJoMCVycT5OUyrmdIqk657zl2ftyTZVUmXMsnT03dxE6W9K8nGMbsufm/vRrvqTcj0hoyp5b\nk3O8StLkdmYbr+64jrvuukvz5uVeh3TjjTe2+Snej370I/3whz/UySefrHvuuUe9e/fWD3/4Q6VS\nKdXUZK7j3Xff1bnnnqtt27apb9++6tWrV+urGD9e1dWtr2P58uXtvr/94IMPVmVl6+tIp9NKpVJt\nfigwe/bsNtexYcMGpVKpNtcxf/78Nh9Z0dTU1Oo6dqmqqtLkyW17dOY6pk6dynVkr2Pbtm0ursNL\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xa2e8c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import xgboost as xgb\n",
    "from sklearn.datasets import load_boston \n",
    "\n",
    "boston = load_boston()  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]\n",
    "\n",
    "xgb_params = {\n",
    "    'eta': 0.1,\n",
    "    'max_depth': 6,\n",
    "    'colsample_bytree': 1,\n",
    "    'colsample_bylevel':1,\n",
    "    'objective': 'reg:linear',\n",
    "    'eval_metric': 'rmse', \n",
    "    'silent': 0,\n",
    "    'seed' : 0\n",
    "}\n",
    "\n",
    "dtrain = xgb.DMatrix(X, Y)\n",
    "\n",
    "num_boost_rounds = 200\n",
    "print(\"num_boost_rounds=\"+str(num_boost_rounds))\n",
    "\n",
    "watchlist = [(dtrain, 'train')]\n",
    "# train model\n",
    "print( \"\\nTraining XGBoost ...\")\n",
    "model= xgb.train(xgb_params,dtrain,num_boost_round=num_boost_rounds,evals=watchlist,early_stopping_rounds=30)\n",
    "\n",
    "# plot the important features \n",
    "fig, ax = plt.subplots(figsize=(12,8))\n",
    "xgb.plot_importance(model, height=0.8, ax=ax)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6 两种顶层特征选择算法\n",
    "## 6.1 稳定性选择(Stability selection)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:57: DeprecationWarning: Class RandomizedLasso is deprecated; The class RandomizedLasso is deprecated in 0.19 and will be removed in 0.21.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their score:\n",
      "[(1.0, 'RM'), (1.0, 'PTRATIO'), (1.0, 'LSTAT'), (0.64500000000000002, 'CHAS'), (0.57499999999999996, 'B'), (0.40000000000000002, 'TAX'), (0.39500000000000002, 'CRIM'), (0.245, 'NOX'), (0.185, 'DIS'), (0.16500000000000001, 'INDUS'), (0.055, 'ZN'), (0.029999999999999999, 'RAD'), (0.01, 'AGE')]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import RandomizedLasso  \n",
    "from sklearn.datasets import load_boston  \n",
    "boston = load_boston()  \n",
    "  \n",
    "#using the Boston housing data.   \n",
    "#Data gets scaled automatically by sklearn's implementation  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]  \n",
    "names = boston[\"feature_names\"]  \n",
    "  \n",
    "rlasso = RandomizedLasso(alpha=0.025)  \n",
    "rlasso.fit(X, Y)  \n",
    "  \n",
    "print (\"Features sorted by their score:\")  \n",
    "print (sorted(zip(map(lambda x: round(x, 4), rlasso.scores_),names), reverse=True))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6.2 递归特征消除 (Recursive feature elimination (RFE) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their rank:\n",
      "[(1, 'NOX'), (2, 'RM'), (3, 'CHAS'), (4, 'PTRATIO'), (5, 'DIS'), (6, 'LSTAT'), (7, 'RAD'), (8, 'CRIM'), (9, 'INDUS'), (10, 'ZN'), (11, 'TAX'), (12, 'B'), (13, 'AGE')]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import RFE  \n",
    "from sklearn.linear_model import LinearRegression  \n",
    "  \n",
    "boston = load_boston()  \n",
    "X = boston[\"data\"]  \n",
    "Y = boston[\"target\"]  \n",
    "names = boston[\"feature_names\"]  \n",
    "  \n",
    "#use linear regression as the model  \n",
    "lr = LinearRegression()  \n",
    "#rank all features, i.e continue the elimination until the last one  \n",
    "rfe = RFE(lr, n_features_to_select=1)  \n",
    "rfe.fit(X,Y)  \n",
    "  \n",
    "print (\"Features sorted by their rank:\")  \n",
    "print (sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names)))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 一个完整的例子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:57: DeprecationWarning: Class RandomizedLasso is deprecated; The class RandomizedLasso is deprecated in 0.19 and will be removed in 0.21.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\tCorr.\tLasso\tLr reg\tMIC\tRF\tRFE\tRidge\tStab\tMean\n",
      "x1\t0.3\t0.79\t1.0\t0.39\t0.55\t1.0\t0.77\t0.77\t0.7\n",
      "x2\t0.44\t0.83\t0.56\t0.61\t0.67\t1.0\t0.75\t0.72\t0.7\n",
      "x3\t0.0\t0.0\t0.5\t0.34\t0.13\t1.0\t0.05\t0.0\t0.25\n",
      "x4\t1.0\t1.0\t0.57\t1.0\t0.56\t1.0\t1.0\t1.0\t0.89\n",
      "x5\t0.1\t0.51\t0.27\t0.2\t0.29\t0.78\t0.88\t0.55\t0.45\n",
      "x6\t0.0\t0.0\t0.02\t0.0\t0.01\t0.44\t0.05\t0.0\t0.06\n",
      "x7\t0.01\t0.0\t0.0\t0.07\t0.02\t0.0\t0.01\t0.0\t0.01\n",
      "x8\t0.02\t0.0\t0.03\t0.05\t0.01\t0.56\t0.09\t0.0\t0.1\n",
      "x9\t0.01\t0.0\t0.0\t0.09\t0.01\t0.11\t0.0\t0.0\t0.03\n",
      "x10\t0.0\t0.0\t0.01\t0.04\t0.0\t0.33\t0.01\t0.0\t0.05\n",
      "x11\t0.29\t0.0\t0.6\t0.43\t0.39\t1.0\t0.59\t0.37\t0.46\n",
      "x12\t0.44\t0.0\t0.14\t0.71\t0.35\t0.67\t0.68\t0.46\t0.43\n",
      "x13\t0.0\t0.0\t0.48\t0.23\t0.07\t0.89\t0.02\t0.0\t0.21\n",
      "x14\t0.99\t0.16\t0.0\t1.0\t1.0\t0.22\t0.95\t0.62\t0.62\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_boston  \n",
    "from sklearn.linear_model import (LinearRegression, Ridge,Lasso, RandomizedLasso)  \n",
    "from sklearn.feature_selection import RFE, f_regression  \n",
    "from sklearn.preprocessing import MinMaxScaler  \n",
    "from sklearn.ensemble import RandomForestRegressor  \n",
    "import numpy as np  \n",
    "from minepy import MINE  \n",
    "  \n",
    "np.random.seed(0)  \n",
    "  \n",
    "size = 750  \n",
    "X = np.random.uniform(0, 1, (size, 14))  \n",
    "  \n",
    "#\"Friedamn #1” regression problem  \n",
    "Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 +  \n",
    "     10*X[:,3] + 5*X[:,4] + np.random.normal(0,1))  \n",
    "#Add 3 additional correlated variables (correlated with X1-X3)  \n",
    "X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4))  \n",
    "  \n",
    "names = [\"x%s\" % i for i in range(1,15)]  \n",
    "  \n",
    "ranks = {}  \n",
    "  \n",
    "def rank_to_dict(ranks, names, order=1):  \n",
    "    minmax = MinMaxScaler()  \n",
    "    ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0]  \n",
    "    ranks = map(lambda x: round(x, 2), ranks)  \n",
    "    return dict(zip(names, ranks ))  \n",
    "  \n",
    "lr = LinearRegression(normalize=True)  \n",
    "lr.fit(X, Y)  \n",
    "ranks[\"Lr reg\"] = rank_to_dict(np.abs(lr.coef_), names)  \n",
    "  \n",
    "ridge = Ridge(alpha=7)  \n",
    "ridge.fit(X, Y)  \n",
    "ranks[\"Ridge\"] = rank_to_dict(np.abs(ridge.coef_), names)  \n",
    "   \n",
    "lasso = Lasso(alpha=.05)  \n",
    "lasso.fit(X, Y)  \n",
    "ranks[\"Lasso\"] = rank_to_dict(np.abs(lasso.coef_), names)  \n",
    "    \n",
    "rlasso = RandomizedLasso(alpha=0.04)  \n",
    "rlasso.fit(X, Y)  \n",
    "ranks[\"Stab\"] = rank_to_dict(np.abs(rlasso.scores_), names)  \n",
    "  \n",
    "#stop the search when 5 features are left (they will get equal scores)  \n",
    "rfe = RFE(lr, n_features_to_select=5)  \n",
    "rfe.fit(X,Y)  \n",
    "ranks[\"RFE\"] = rank_to_dict(list(map(float, rfe.ranking_)), names, order=-1)  \n",
    "  \n",
    "rf = RandomForestRegressor()  \n",
    "rf.fit(X,Y)  \n",
    "ranks[\"RF\"] = rank_to_dict(rf.feature_importances_, names)    \n",
    "  \n",
    "f, pval  = f_regression(X, Y, center=True)  \n",
    "ranks[\"Corr.\"] = rank_to_dict(f, names)  \n",
    "  \n",
    "mine = MINE()  \n",
    "mic_scores = []  \n",
    "for i in range(X.shape[1]):  \n",
    "    mine.compute_score(X[:,i], Y)  \n",
    "    m = mine.mic()  \n",
    "    mic_scores.append(m)    \n",
    "ranks[\"MIC\"] = rank_to_dict(mic_scores, names)    \n",
    "  \n",
    "r = {}  \n",
    "for name in names:  \n",
    "    r[name] = round(np.mean([ranks[method][name] for method in ranks.keys()]), 2)    \n",
    "methods = sorted(ranks.keys())  \n",
    "ranks[\"Mean\"] = r  \n",
    "methods.append(\"Mean\")  \n",
    "  \n",
    "# ranks = pd.DataFrame(ranks)\n",
    "print(\"\\t%s\" % \"\\t\".join(methods))  \n",
    "for name in names:  \n",
    "    print(\"%s\\t%s\" % (name, \"\\t\".join(map(str,[ranks[method][name] for method in methods]))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
